﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/*
 * 1 属性访问器省略
 *              --get方法不可以省略
 *              
 *              --set方法可以省略
 *                  -构造方法内部可以对set省略的属性进行赋值
 *                  -类内其他方法内,不可以对set省略的属性进行赋值
 *                  
 *              --省略了set的属性为只读：
 *                  -只读属性的初始化在构造方法内部
 *                  -只读属性在初始化之后，就无法进行更改了
 *                  -只读属性应用 在某个属性初始化一次，后续不可更改（比如：身份证号）
 */

namespace 面向对象_属性省略与权限控制
{
    internal class Program
    {

        class Player
        {
            public int Money
            {
                //如果省略了get，类内/类外方法均无法访问当前数据，无意义
                get;

                //省略set：意味着Money属性变为了只读属性，只能够读取，不能够写入
                //只读规则不仅限制了类外方法，也限制了类内方法
                //set;
            }

            public Player()
            {
                Money = 100;//省略了set方法的属性，可以被构造方法赋值
            }



            //public void setMoney(int money)
            //{
            //    Money = money;
            //}
        }


        class Student
        {
            public int ID
            {
                get;
            }

            public Student( int id )
            {
                ID = id;
            }
        }


        class User
        {
            //使用uint：钱的数目不可能为负数
            //注意：不能为一个属性的两个访问器同时增加private限定符

            //属性的访问限定符：用于修饰属性的访问
            //--属性访问限定符能够同时对set跟get进行限定

            //属性限定符与访问器限定符的关系：
            //          1 --如果set/get没有限定符，则沿用属性限定符
            //                      private uint Money
            //                       {
            //                             get;
            //                             set; 
            //                       }

            //          2 --如果set/get拥有比属性更严格的限定符，则使用访问器自己的限定符
            //                      public uint Money
            //                      {
            //                             get;
            //                             private set;
            //                      }
            //          3 --如果set/get拥有的限定符严格程度小于等于属性的限定符，则报错
            //                      private uint Money
            //                      {
            //                             get;
            //                             private set;
            //                      }

            public uint Money
            {
                get;
                set;
            }

            public void addMoney(uint money)
            {
                if(money < 0)
                {
                    Console.WriteLine("干啥！！！");
                    return;
                }
                Money = Money + money;
            }
        }

        static void Main(string[] args)
        {
            User user = new User();
            user.addMoney(100);
            Console.WriteLine(user.Money);



            Console.Read();




















            Player player = new Player();
            //如果省略了set，类外方法对Money进行赋值，会尝试寻找Money.set方法，找不到
            //player.Money = 100;
            Console.WriteLine(player.Money);
        }
    }
}
